#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>


//memcpy函数
//函数原型
//void* memcpy (void* dest, void* src, size_t num);
//注意：num代表的是字节数
//函数memcpy从src的位置开始向后复制num个字节的数据到dest指向的内存位置
//这个函数在遇到'\0'的时候并不会停下来
//如果src和dest有任何的重叠，复制的结果就是未定义的


//strcpy - 针对的是字符串的拷贝
//memcpy - 针对的是内存块的拷贝，不在乎类型

//void* my_memcpy(void* dest, const void* src, size_t num)
//{
//	void* ret = dest;
//
//	assert(dest && src);
//
//	while (num--)
//	{
//		*(char*)dest = *(char*)src;
//		dest = (char*)dest + 1;  // == ((char*)dest)++;
//		src = (char*)src + 1;    // == ((char*)src)++;s
//
//	}
//	return ret;
//}
//
//
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[10] = { 0 };
//	my_memcpy(arr2, arr1, 5 * sizeof(int));
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	return 0;
//}

//对于重叠的内存，交给memmove处理
//memmove函数


//memmove函数拷贝空间完成后，会返回目标空间的起始地址
//void* my_memmove(void* dest, const void* src, size_t num)
//{
//	void* ret = dest;
//	//由dest的位置，是在src前面，还是在src后面来决定是从前往后拷贝，还是从后往前拷贝，不会将内存覆盖
//
//	if (dest < src)
//	{
//		//从前往后拷贝
//		while (num--)
//		{
//			(char*)dest = (char*)src;
//			dest = (char*)dest + 1;
//			src = (char*)src + 1;
//		}
//	}
//	else
//	{
//		//从后往前拷贝
//		while (num--)//num--是先使用，再--，所以进入到while里面的时候就已经--了
//		{
//			*((char*)dest + num) = *((char*)src + num);
//
//		}
//	}
//	return ret;
//}
//
//
//
//
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	my_memmove(arr1 + 3, arr1, 5 * sizeof(int));
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr1[i]);
//	}
//	return 0;
//}



//memset函数
// 函数原型
//void* memset(void* ptr, int value, size_t num);
//memset是用来设置内存的，将内存中的值 ！！！以字节为单位！！！设置成想要的内容


//int main()
//{
//	int arr[] = { 1,2,3,4,5 };
//	memset(arr, 2, 20);//注意，是以字节为单位设置的，做不到以元素为单位设置
//	                  //所以该代码无法实现想象中的功能
//
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//
//	return 0;
//}


//int main()
//{
//	char arr[20] = "hello world";
//	memset(arr, 'w', 6 * sizeof(char));//注意，是以字节为单位设置的
//
//	printf("%s\n", arr);
//
//	return 0;
//}

//memcmp函数
//函数原型
//int memcmp(const void* ptr1, const void* ptr2, size_t num);
//比较 从ptr1和ptr2指针指向的位置开始，向后的最多num个字节
//ptr1 > ptr2 返回大于0
//ptr1 < ptr2 返回小于0
//ptr1 = ptr2 返回0

//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[] = { 1,2,3,4,5,6,7,8,8,8,9 };
//
//	int ret = memcmp(arr1, arr2, 9 * sizeof(int));
//	printf("%d\n", ret);
//
//	return 0;
//}


/**
* 1(byte)个字节 = 8个比特位(bit)
* 1个比特位，存放一个 1/0 
* 4个二进制 可以存放在 1个16进制位里面
* 8个二进制 ---> 8个0/1 ----> 1个字节 ---->2个16进制位
* 
* eg:
*   00000000  00000000  00000000  00000001
*                  ||
*                  ||  
*              *** || ***
*               ** || **
*                * || *
*                  **
* 0x00        00        00        01
*/